﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Biciq.Datos;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel.DomainServices.Client;

namespace Biciq.Silverlight.UI
{
    public class RolesVistaModelo:VistaModeloBase
    {
          #region campos
        private RelayCommand _comandoAbrirNuevo;
        private RelayCommand _comandoAcceso;
        private EditarRolVistaModelo _editarRolVistaModelo;
        private EditarRolVista _editarRolVista;
        private Rol _rolActual;
        private RelayCommand _comandoEditar;
        private Rol _rolItem;
        private EditarAccesoVista _editarAccesoVista;
        private EditarAccesoVistaModelo _editarAccesoVistaModelo;
        private Usuario _usuarioLogueado;
     
        private List<Recurso> _recursosEmpleado;
        private List<Rol> _listaRol;
        private String _busqueda;
        private RelayCommand _comandoBuscar;
        private bool _mostrarErrores;
        #endregion

        #region constructores
        public RolesVistaModelo()
        {
            MostrarErrores = Visibility.Collapsed;
            InicializarMensajesError();
            this.EsInicio = true;
            Buscar();
        }


        #endregion

        #region metodos Publicos

        #endregion

        #region propiedades
        /// <summary>
        /// Comando que se dispara al dar click en el botón buscar
        /// </summary>
        public RelayCommand ComandoBuscar
        {
            get
            {
                if (_comandoBuscar == null)
                {
                    _comandoBuscar = new RelayCommand
                    (

                          p => Buscar()
                    );
                }
                return _comandoBuscar;
            }
        }

        /// <summary>
        /// Criterio de Búsqueda
        /// </summary>
        public string Busqueda
        {
            get { return _busqueda; }
            set
            {
                _busqueda = value;
                RaisePropertyChanged("Busqueda");
            }
        }

        /// <summary>
        /// Propiedad que muestra la lista de Roles
        /// </summary>
        public List<Rol> ListaRol
        {
            get { return _listaRol; }
            set
            {
                _listaRol = value;
                RaisePropertyChanged("ListaRol");
            }
        }

        /// <summary>
        /// Usuario Logueado en el Sistema
        /// </summary>
        public Usuario UsuarioLogueado
        {
            get { return _usuarioLogueado; }
            set
            {
                _usuarioLogueado = value;
                RaisePropertyChanged("UsuarioLogueado");
            }
        }
        
        /// <summary>
        /// Recursos del empleado logueado
        /// </summary>
        public List<Recurso> RecursosEmpleado
        {
            get { return _recursosEmpleado; }
            set
            {
                _recursosEmpleado = value;
                RaisePropertyChanged("RecursosEmpleado");
            }
        }

        /// <summary>
        /// Propiedad para ingresar los accesos
        /// </summary>
        public RelayCommand ComandoAcceso
        {
            get
            {
                return _comandoAcceso ?? (_comandoAcceso = new RelayCommand(EditarAcceso));
            }
        }
        /// <summary>
        /// Item selecionado en la grilla
        /// </summary>
        public Rol RolItem
        {
            get { return _rolItem; }
            set { _rolItem = value; }
        }

        /// <summary>
        /// Comando para edición
        /// </summary>
        public RelayCommand ComandoEditar
        {
            get
            {
                return _comandoEditar ?? (_comandoEditar = new RelayCommand(EditarRol));
            }

        }

        /// <summary>
        /// Comando para crear un nuevo item
        /// </summary>
        public RelayCommand ComandoAbrirNuevo
        {
            get
            {
                if (_comandoAbrirNuevo == null)
                {
                    _comandoAbrirNuevo = new RelayCommand
                    (
                        p => AbrirNuevo()
                    );
                }
                return _comandoAbrirNuevo;
            }
        }
        #endregion

        #region metodos Privados
        /// <summary>
        /// Realiza la Búsqueda de Empleados
        /// </summary>
        private void Buscar()
        {

            BiciqContexto.Rols.Clear();

            var datos = BiciqContexto.Rols;
            if (Busqueda != null && Busqueda != "")
            {
                if (!_mostrarErrores)
                {
                    InicializarMensajesError();
                }

                BiciqContexto.Load(BiciqContexto.GetBusquedaRolNombreQuery(Busqueda)).Completed += delegate
                {
                    ListaRol = datos.ToList();
                    Busqueda = "";
                    validaBusqueda(ListaRol);                   
                };
            }
            else
            {
                BiciqContexto.Load(BiciqContexto.GetRolsQuery()).Completed += delegate
                {
                    ListaRol = datos.ToList();
                    Busqueda = "";
                    validaBusqueda(ListaRol);                   
                };
            }

           
        }
      
        /// <summary>
        /// Lista de Accesos
        /// </summary>
        /// <returns></returns>
        private void EditarAcceso(object parametro)
        {
            this.RolItem = (Rol)parametro;
            InstanciaEditarAcceso(_rolItem);
        }

        /// <summary>
        /// Método en el cual se edita el item seleccionado
        /// </summary>

        private void EditarRol(object parametro)
        {
            this.RolItem = (Rol)parametro;
            _editarRolVistaModelo = new EditarRolVistaModelo();
            _editarRolVista = new EditarRolVista();
            _editarRolVistaModelo.IsDirty = true;
            InstanciaEditarRol(this.RolItem);
        }

        /// <summary>
        /// Método en el cual se crea un nuevo item
        /// </summary>
        private void AbrirNuevo()
        {
            _editarRolVistaModelo = new EditarRolVistaModelo();
            _editarRolVista = new EditarRolVista();
            InstanciaEditarRol(_rolActual);
        }

        /// <summary>
        /// Para editar los roles
        /// </summary>
        /// <param name="rol"></param>
        private void InstanciaEditarRol(Rol rol)
        {
            _editarRolVista = new EditarRolVista();
            _editarRolVistaModelo = new EditarRolVistaModelo();
            if (rol != null)
            {
                _editarRolVistaModelo = new EditarRolVistaModelo(rol);
            }
            else
            {
                _editarRolVistaModelo = new EditarRolVistaModelo();
            }


            _editarRolVistaModelo.EventoCerrarEditor += delegate
            {
                _editarRolVista.Close();
                BiciqContexto.Rols.Clear();
                _comandoBuscar = null;
                ComandoBuscar.Execute(true);

            };

            _editarRolVista.DataContext = _editarRolVistaModelo;
            _editarRolVista.HasCloseButton = false;
            _editarRolVista.Show();
        }

        /// <summary>
        /// Para editar los accesos
        /// </summary>
        /// <param name="rol"></param>
        private void InstanciaEditarAcceso(Rol rol)
        {
            _editarAccesoVista = new EditarAccesoVista();

            if (rol != null)
            {
                _editarAccesoVistaModelo = new EditarAccesoVistaModelo(rol);
            }



            _editarAccesoVistaModelo.EventoCerrarEditor += delegate
            {
                _editarAccesoVista.Close();
            };


            _editarAccesoVista.DataContext = _editarAccesoVistaModelo;

            //mostramos el popup
            _editarAccesoVista.HasCloseButton = false;
            _editarAccesoVista.Show();
        }


        public override void Eliminar(object parametro)
        {
            String titulo = RecursosLenguaje.Recursos.EliminarRoTitulo;
            Action accion = EliminarRol;
            this.RolItem = (Rol)parametro;
            LogicStudio.Framework.UI.Controles.CuadroDialogo.Mostrar
                (RecursosLenguaje.Recursos.EliminarRolMensaje, titulo, LogicStudio.Framework.UI.Utilidades.TipoVentana.Confirmar, accion);

        }

        private void EliminarRol()
        {
            InicializarMensajesError();
            BiciqContexto.GetRolPorUsuario(this.RolItem.id).Completed += (o, v) =>
            {
                Procesando = true;
                InvokeOperation<Result> result = (InvokeOperation<Result>)o;

                if (result.Value != null)
                {
                    if (!result.Value.estado)
                    {
                        AgregarMensajeInformacion(string.Format(RecursosLenguaje.Recursos.RolConUsuario));
                        MostrarErrores = Visibility.Visible;
                    }
                    else
                    {
                       
                        this.RolItem.estado = RecursosLenguaje.Recursos.Inactivo.ToUpper();
                        BiciqContexto.SubmitChanges().Completed += delegate
                        {
                            InicializarMensajesError();
                            AgregarMensajeInformacion(string.Format(RecursosLenguaje.Recursos.RolEliminado));                           
                            _mostrarErrores = true;
                            this.EsInicio = true;
                            Buscar();
                        };
                    }
                }

                Procesando = false;
            };


        }

        #endregion
    }
}
